﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//1.abc依次是多少
int main()
{
	int a, b, c;
	a = 5;
	c = ++a;
	b = ++c, c++, ++a, a++;//逗号表达式的优先级是最低的，所以这里应该是等号优先
	b += a++ + c;
	printf("a = %d b = %d c = %d\n", a, b, c);//9 23 8
	return 0;
}

//2.交换两个变量（不创建临时变量）
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("%d %d", a, b);
	return 0;
}

//3.输入一个整数 n ，输出该数32位二进制表示中1的个数。其中负数用补码表示

//思路一：就是跟十进制的到每一位一样，模2除2获得二进制的每一位
int NumberOf1(unsigned int n)
{
	int count = 0;
	while (n)
	{
		if (n % 2 == 1)
		{
			count++;
		}
		n = n / 2;
	}
	return count;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	//计算过程
	int ret = NumberOf1(n);
	printf("%d", ret);
	return 0;
}

//思路二：使用逻辑与，让每一位都跟1与，如果结果是1，说明该位是1
int NumberOf1(int n)
{
	int count = 0;
	int i = 0;
	for (i = 0; i < 32; i++)
	{
		if (((n >> i) & 1) == 1)
		{
			count++;
		}
	}
	return count;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	//计算过程
	int ret = NumberOf1(n);
	printf("%d", ret);
	return 0;
}

//思路三;n = n&(n-1),这个表达式每执行一次，都会去掉一次n最右边的1，说明执行几次就有几个1
int NumberOf1(int n)
{
	int count = 0;
	while (n)
	{
		n = n & (n - 1);
		count++;
	}
	return count;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	//计算过程
	int ret = NumberOf1(n);
	printf("%d", ret);
	return 0;
}

//写一个函数，判断一个数字n是否为2的k次方
//思路：也就是二进制代码里只有一个1
int main()
{
	int n = 0;
	scanf("%d", &n);
	if (n & (n - 1) == 0)
	{
		printf("yes");
	}
	return 0;
}

//4.获取一个整数二进制序列中所有的偶数位和奇数位，分别打印出二进制序列
void Print(int n)
{
	int i = 0;
	printf("奇数位; ");
	for (i = 30; i >= 0; i -= 2)
	{
		printf("%d", ((n >> i) & 1));
	}
	printf("\n偶数位：");
	for (i = 31; i >= 0; i -= 2)
	{
		printf("%d", ((n >> i) & 1));
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	Print(n);//打印二进制n的所有奇数位和所有偶数位
	return 0;
}

//5.输入两个整数，求两个整数二进制格式有多少个位不同
void Compare(int m, int n)
{
	int i = 0;
	int count = 0;
	for (i = 0; i < 32; i++)
	{
		if (((m >> i) & 1) != ((n >> i) & 1))
		{
			count++;
		}
	}
	printf("%d", count);
}
int main()
{
	int m = 0;
	int n = 0;
	while (scanf("%d %d", &m, &n))
	{
		Compare(m, n);
		printf("\n");
	}
	return 0;
}

//6.小乐乐上课需要走n阶台阶，因为他腿比较长，所以每次可以选择走一阶或者走两阶，那么他一共有多少种走法？
int method(int m)
{
	if (m <= 2)
	{
		return m;
	}
	else
	{
		return method(m - 1) + method(m - 2);
	}
}
int main()
{
	int m = 0;
	scanf("%d", &m);
	int ret = method(m);
	printf("%d", ret);
	return 0;
}


//7.KiKi想获得某年某月有多少天，请帮他编程实现。输入年份和月份，计算这一年这个月有多少天

//Get_Days函数第一种写法：
int Get_Days(int y, int m)
{
	if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12)
	{
		return 31;
	}
	else if (m == 4 || m == 6 || m == 9 || m == 11)
	{
		return 30;
	}
	else if (m == 2)
	{
		if ((y % 4 == 0) && (y / 100 != 0) || (y / 400) == 0))
		{
			return 29;
		}
		else
		{
			return 28;
		}
	}
	else
	{
		return 0;
	}
}
int main()
{
	int y = 0;
	int m = 0;
	while (scanf("%d %d", &y, &m) == 2)
	{
		int ret = Get_Days(y, m);
		printf("%d\n", ret);
	}
	return 0;
}

//Get_Days函数第二种写法（使用数组）：
int Grt_Days(int m, int n)
{
	int Days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	//                 1  2  3   4  5  6  7  8  9  10 11 12
	int days = Days[m];
	if ((m == 2) && (y % 4 == 0) && (y / 100 != 0) || (y / 400) == 0))
	{
		day++;
	}
	return day;
}
int main()
{
	int y = 0;
	int m = 0;
	while (scanf("%d %d", &y, &m) == 2)
	{
		int ret = Get_Days(y, m);
		printf("%d\n", ret);
	}
	return 0;
}

//8.下面程序输出结果为：
int i;
int main()
{
	i--;
	if (i > sizeof(i))//注：sizeof的计算结果是无符号的整数，是unsigned int
//size_t就是sizeof计算结果的类型，即size_t —>unsigned int
//而左边i是int类型，右边是unsigned int类型，所以要进行算术转换，左边的-1要转换成无符号的int类型
	{
		printf(">\n");
	}
	else
	{
		printf("<\n");
	}
	return 0;
}
//输出结果为 >  

//在c语言中：四种常见类型都怎么规定的
//char   ->到底是signed还是unsigned，常见的编译器都是signed char
//short  ->signed int
//int    ->signed short
//long   ->signed long

//9.输入 NxM 矩阵，矩阵元素均为整数，计算其中大于零的元素之和
int main()
{
	int n = 0;
	int m = 0;
	scanf("%d %d", &n, &m);
	//vs不支持变长数组，所以不能使用arr[n][m]
	int i = 0;
	int j = 0;
	int tmp = 0;
	int sum = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			scanf("%d", &tmp);
			if (tmp > 0)
			{
				sum = sum + tmp;
			}
		}
	}
	printf("%d\n", sum);
	return 0;
}

//10.输入一个正整数n,把他转换成六进制
//方法一：
int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[30];
	int i = 0;
	while (n)
	{
		arr[i++] = n % 6;
		n /= 6;
	}
	for (--i; i >= 0; i--)
	{
		printf("%d", arr[i]);
	}
	return 0;
}
//方法二：递归
void Print(int n)
{
	if (n > 5)
	{
		Print(n / 6);
	}
	printf("%d", n % 6);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	Print(n);
	return 0;
}

//11.【二维数组】矩阵转置，将一个矩阵进行转置
int main()
{
	int n = 0;
	int m = 0;
	scanf("%d %d", &n , & m);
	int arr[30][30];//如果支持变长数组，那么就定义成int arr[n][m];
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < n; j++)
		{
			printf("%d ", arr[j][i]);
		}
		printf("\n");
	}
	return 0;
}

//12.有一个整数序列（可能有重复的整数），现删除指定的某一个整数
// 输出删除指定数字之后的序列，序列中未被删除数字的前后位置没有发生改变。
//若序列中有多个指定的数，需要一起删除。
//方法一（直接不打印该元素）：
int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[30];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}
	int del = 0;
	scanf("%d", &del);
	for (int i = 0; i < n; i++)
	{
		if (arr[i] == del)
		{
			continue;
		}
		printf("%d", arr[i]);
	}
	return 0;
}

//方法二（删除该元素）：
int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[30];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}
	int del = 0;
	scanf("%d", &del);
	int j = 0;
	for (int i = 0; i < n; i++)
	{
		if (arr[i] != del)
		{
			arr[j++] = arr[i];
		}
	}
	for (int i = 0; i < j; i++)
	{
		printf("%d", arr[i]);
	}
	return 0;
}

​